﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using LayerData.DataBaseManager;
using LayerEntity.Producto;
using Npgsql;
using LayerEntity.Sistema;

namespace LayerData.Producto
{
    public class DProducto
    {
        #region Variables
        readonly string mensajeExecuteReader = "Error al Recuperar #replace, revise lo Siguiente: ";
        readonly IPostgreSqlConnectionInfo connectionInfo;
        public IPostgreSqlConnectionInfo CurrentConection { get; set; }
        #endregion
        #region Contructores
        public DProducto()
        {
            this.connectionInfo = ObjectFactory.CreateConnectionInfo();
        }

        public DProducto(IPostgreSqlConnectionInfo con)
        {
            this.connectionInfo = con;
            this.CurrentConection = con;
        }

        #endregion

        #region OPERACION DE GRABACION
        public string MantenimientoPrecios(EPrecios precio, EnumOperaciones operacion)
        {
            String proc = "";
            bool res = false;
            NpgsqlConnection con = null;
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                NpgsqlTransaction tran = this.CurrentConection.GetTransaction(con);
                object[] Dataobj = new object[]
                {
                    precio.id_producto
                };
                proc = (string)PostgreSqlHelper.ExecuteScalar(this.CurrentConection, tran, "ALMACEN.ISP_GRABAR_PRECIOS", precio.ToObjectData((int)operacion, Dataobj));
                if (proc == "0")
                {
                    res = true;
                }
                else
                {
                    this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                    res = false;
                }
                if (res == true)
                {
                    this.CurrentConection.CommintTransaction(tran);
                }
            }
            catch (NpgsqlException ex)
            {
                Console.Write(ex.Message);
                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                proc = ex.Message;
                throw;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return proc;
        }

        public string MantenimientoProductos(EProducto producto, EPrecios precio, EnumOperaciones operacion)
        {
            String proc = "";
            String Msg = "";
            bool res = false;
            NpgsqlConnection con = null;
            string[] result = null;
            object obj;
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                NpgsqlTransaction tran = this.CurrentConection.GetTransaction(con);
                obj = PostgreSqlHelper.ExecuteScalar(this.CurrentConection, tran, "almacen.ISP_GRABAR_PRODUCTO", producto.ToObjectData((int)operacion));
                if (obj != null)
                {
                    result = (string[])obj;
                }
                else
                {

                    result = new string[] { "I-00" };
                }
                String idprod = string.Empty;
                if ((int)operacion == 1)
                {
                    if (result[0] == "0")
                    {
                        idprod = result[1];
                        Console.Write(string.Format("codigo de producto :{0}", idprod));
                        proc = result[0];
                        producto.id_producto = idprod;
                    }
                    else
                    {
                        proc = result[0];
                    }
                }
                else
                {
                    proc = result[0];
                    idprod = producto.id_producto;
                }
                if (proc == "0")
                {
                    if ((int)operacion == 1)// si es nuevo producto registra con sus unidades de medida
                    {
                        object[] Dataobj = new object[]
                        {
                            idprod
                        };
                        proc = (string)PostgreSqlHelper.ExecuteScalar(this.CurrentConection, tran, "ALMACEN.ISP_GRABAR_PRECIOS", precio.ToObjectData((int)operacion, Dataobj));
                        if (proc == "0")
                        {
                            res = true;
                        }
                        else
                        {
                            this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                            res = false;
                        }
                    }
                    else
                    {
                        // si no se ha editado ninguna unidad de medida
                        res = true;
                    }
                    // res = true;
                }
                else
                {
                    if (proc == "-1")
                    {
                        res = false;
                        this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                    }
                    else
                    {
                        if (proc == "-2")
                        {
                            res = false;
                            this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                        }
                        else
                        {
                            if (proc == "-3")
                            {
                                res = false;
                                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                            }
                            else
                            {
                                res = false;
                                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                            }
                        }
                    }
                }
                if (res == true)
                {
                    this.CurrentConection.CommintTransaction(tran);
                }
            }
            catch (NpgsqlException ex)
            {
                Console.Write(ex.Message);
                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                proc = ex.Message;
                throw;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return proc;
        }

        public string MantenimientoGrupos(EGrupo grupo, EnumOperaciones operacion)
        {
            String proc = "";
            String Msg = "";
            bool res = false;
            NpgsqlConnection con = null;
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                NpgsqlTransaction tran = this.CurrentConection.GetTransaction(con);
                Msg = (string)PostgreSqlHelper.ExecuteScalar(this.CurrentConection, tran, "almacen.isp_grabar_grupos", grupo.ToObject((int)operacion));
                String idGrupo = string.Empty;
                Console.Write(string.Format("--- : {0}\n", Msg));
                if ((int)operacion == 1)
                {
                    if (Msg.Substring(0, 1) == "0")
                    {
                        idGrupo = Msg.Substring(0, Msg.Length);
                        proc = Msg.Substring(0, 1);
                        grupo.Id_Grupo = idGrupo;
                    }
                    else
                    {
                        proc = Msg;
                    }
                }
                else
                {
                    proc = Msg;
                    idGrupo = grupo.Id_Grupo.ToString();
                }
                Console.Write(string.Format("vereficando Datos: {0}\n", proc));
                if (proc == "0")
                {
                    Console.Write(string.Format("--- TRANZACCION HACEPTADA {0}", Msg));
                    res = true;
                }
                else
                {
                    if (proc == "-1")
                    {
                        res = false;
                        this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                    }
                    else
                    {
                        if (proc == "-2")
                        {
                            res = false;
                            this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                        }
                        else
                        {
                            if (proc == "-3")
                            {
                                res = false;
                                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                            }
                            else
                            {
                                res = false;
                                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                            }
                        }
                    }
                }
                if (res == true)
                {
                    this.CurrentConection.CommintTransaction(tran);
                }
            }
            catch (NpgsqlException ex)
            {
                Console.Write(ex.Message);
                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                proc = ex.Message;
                throw;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return proc;
        }

        public string MantenimientoFamilias(EFamilia familia, EnumOperaciones operacion)
        {
            String proc = "";
            String Msg = "";
            bool res = false;
            NpgsqlConnection con = null;
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                NpgsqlTransaction tran = this.CurrentConection.GetTransaction(con);
                Console.Write(string.Format("ID DEL GRUPO :{0}\n", familia.Id_Grupo));
                Msg = (string)PostgreSqlHelper.ExecuteScalar(this.CurrentConection, tran, "almacen.isp_grabar_familas", familia.ToObjectData((int)operacion));
                String idfamilia = string.Empty;
                Console.Write(string.Format("--- : {0}\n", Msg));
                if ((int)operacion == 1)
                {
                    if (Msg.Substring(0, 1) == "0")
                    {
                        idfamilia = Msg.Substring(0, Msg.Length);
                        proc = Msg.Substring(0, 1);
                        familia.idfamilia = idfamilia;
                    }
                    else
                    {
                        proc = Msg;
                    }
                }
                else
                {
                    proc = Msg;
                    idfamilia = familia.idfamilia.ToString();
                }
                Console.Write(string.Format("vereficando Datos: {0}\n", proc));
                if (proc == "0")
                {
                    Console.Write(string.Format("--- TRANZACCION HACEPTADA {0}", Msg));
                    res = true;
                }
                else
                {
                    if (proc == "-1")
                    {
                        res = false;
                        this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                    }
                    else
                    {
                        if (proc == "-2")
                        {
                            res = false;
                            this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                        }
                        else
                        {
                            if (proc == "-3")
                            {
                                res = false;
                                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                            }
                            else
                            {
                                res = false;
                                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                            }
                        }
                    }
                }
                if (res == true)
                {
                    this.CurrentConection.CommintTransaction(tran);
                }
            }
            catch (NpgsqlException ex)
            {
                Console.Write(ex.Message);
                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                proc = ex.Message;
                throw;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return proc;
        }

        public string MantenimientoUnidades(EUnimed unidad, EnumOperaciones operacion)
        {
            String proc = "";
            String Msg = "";
            bool res = false;
            NpgsqlConnection con = null;
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                NpgsqlTransaction tran = this.CurrentConection.GetTransaction(con);
                Msg = (string)PostgreSqlHelper.ExecuteScalar(this.CurrentConection, tran, "COMMON.ISP_GRABAR_UNIDAD", unidad.ToObjectData((int)operacion));
                int idunidad;
                if ((int)operacion == 1)
                {
                    if (Msg.Substring(0, 1) == "0")
                    {
                        idunidad = int.Parse(Msg.Substring(0, Msg.Length));
                        proc = Msg.Substring(0, 1);
                        unidad.id_unidad = idunidad;
                    }
                    else
                    {
                        proc = Msg;
                    }
                }
                else
                {
                    proc = Msg;
                    idunidad = unidad.id_unidad;
                }
                Console.Write(string.Format("vereficando Datos: {0}\n", proc));
                if (proc == "0")
                {
                    Console.Write(string.Format("--- TRANZACCION HACEPTADA {0}", Msg));
                    res = true;
                }
                else
                {
                    if (proc == "-1")
                    {
                        res = false;
                        this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                    }
                    else
                    {
                        if (proc == "-2")
                        {
                            res = false;
                            this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                        }
                        else
                        {
                            if (proc == "-3")
                            {
                                res = false;
                                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                            }
                            else
                            {
                                res = false;
                                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                            }
                        }
                    }
                }
                if (res == true)
                {
                    this.CurrentConection.CommintTransaction(tran);
                }
            }
            catch (NpgsqlException ex)
            {
                Console.Write(ex.Message);
                this.CurrentConection.CancelarConexionTrans(this.CurrentConection.GetPostgreSqlConnection());
                proc = ex.Message;
                throw;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return proc;
        }

        #endregion
        /// <summary>
        /// Obtiene los Hoteles >.Registrados
        /// </summary>
        /// <returns>
        /// Un <see cref="T:List"/> con los Resultados del Comando
        /// </returns>
        public List<EListaPrecios> GetListaPrecios()
        {
            NpgsqlDataReader dr = null;
            List<EListaPrecios> hotel = new List<EListaPrecios>();
            try
            {
                dr = PostgreSqlHelper.ExecuteReader(this.connectionInfo, CommandType.Text, "select * from almacen.v_listar_lista_precios");
                if (dr != null)
                {
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            hotel.Add(new EListaPrecios(dr));
                        }
                    }
                }
            }
            catch (NpgsqlException ex)
            {
                DataBaseUtils.PrintMessajeError(this.mensajeExecuteReader.Replace("#replace", " Los Hoteles"), ex);
            }
            finally
            {
                DataBaseUtils.CloseNPgsqlDataReader(dr);
            }
            return hotel;
        }

        public DataTable GetListaGrupo(EGrupo obj)
        {
            DataTable dtb;
            NpgsqlConnection con = null;
            NpgsqlDataAdapter da = null;
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                da = new NpgsqlDataAdapter(string.Format("select * from almacen.v_listar_grupo where nombre ilike '%{0}%'", obj.Nombre), con);
                dtb = new DataTable();
                da.Fill(dtb);
            }
            catch (NpgsqlException ex)
            {
                this.CurrentConection.CloseConnection(con);
                Console.Write(string.Format("{0}/{1}", ex.Message, ex.Source));
                DataBaseUtils.PrintMessajeError(this.mensajeExecuteReader.Replace("#replace", " Los Grupos"), ex);
                return null;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return dtb;
        }

        public DataTable GetListaFamilia(EFamilia obj)
        {
            DataTable dtb;
            NpgsqlConnection con = null;
            AccesoBD db = new AccesoBD();
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                dtb = db.EjecutaModelView("almacen.vlistar_familias", new object[] { obj.Nombre }, con);
            }
            catch (NpgsqlException ex)
            {
                this.CurrentConection.CloseConnection(con);
                Console.Write(string.Format("{0}/{1}", ex.Message, ex.Source));
                DataBaseUtils.PrintMessajeError(this.mensajeExecuteReader.Replace("#replace", " Los Grupos"), ex);
                return null;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return dtb;
        }

        public DataTable GetListaUnidad(EUnimed obj)
        {
            DataTable dtb;
            NpgsqlConnection con = null;
            AccesoBD db = new AccesoBD();
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                dtb = db.EjecutaModelView("COMMON.V_LISTAR_UNIMED", new object[] { obj.des_unidad }, con);
            }
            catch (NpgsqlException ex)
            {
                this.CurrentConection.CloseConnection(con);
                Console.Write(string.Format("{0}/{1}", ex.Message, ex.Source));
                DataBaseUtils.PrintMessajeError(this.mensajeExecuteReader.Replace("#replace", " Los Grupos"), ex);
                return null;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return dtb;
        }
        public List<EProducto> GetProductos() {
            NpgsqlDataReader dr = null;
            List<EProducto> lista = new List<EProducto>();
                       
            try
            {
                dr = PostgreSqlHelper.ExecuteReader(this.connectionInfo, CommandType.Text, "select * from almacen.tb_producto");
                if (dr != null)
                {
                    if (dr.HasRows)
                    {
                        while (dr.Read())
                        {
                            lista.Add(new EProducto(dr));
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                DataBaseUtils.PrintMessajeError(this.mensajeExecuteReader.Replace("#replace", " Productos"), ex);
            }
            finally
            {
                DataBaseUtils.CloseNPgsqlDataReader(dr);
            }
            return  lista ;
        }
        public DataTable GetListaProductos(EProducto obj)
        {
            DataTable dtb;
            NpgsqlConnection con = null;
            AccesoBD db = new AccesoBD();
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                dtb = db.EjecutaModelView("almacen.v_listar_producto", new object[] { obj.descripcion }, con);
            }
            catch (NpgsqlException ex)
            {
                this.CurrentConection.CloseConnection(con);
                Console.Write(string.Format("{0}{1}{2}", ex.Message, @"/", ex.Source));
                DataBaseUtils.PrintMessajeError(this.mensajeExecuteReader.Replace("#replace", " Los Grupos"), ex);
                return null;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return dtb;
        }

        public DataTable GetListaPrecios(EPrecios obj)
        {
            DataTable dtb;
            NpgsqlConnection con = null;
            
            AccesoBD db = new AccesoBD();
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                dtb = db.EjecutaModelView("almacen.V_LISTAR_PRECIOS", new object[] { obj.Condicion }, con);
            }
            catch (NpgsqlException ex)
            {
                this.CurrentConection.CloseConnection(con);
                Console.Write(string.Format("{0}/{1}", ex.Message, ex.Source));
                DataBaseUtils.PrintMessajeError(this.mensajeExecuteReader.Replace("#replace", " Los Grupos"), ex);
                return null;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return dtb;
        }

        public DataTable GetListaGeneralProductos(EProducto obj)
        {
            DataTable dtb;
            NpgsqlConnection con = null;

            AccesoBD db = new AccesoBD();
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                dtb = db.EjecutaModelView("almacen.v_listadoGeneralProducto", new object[] { obj.Condicion }, con);
            }
            catch (NpgsqlException ex)
            {
                this.CurrentConection.CloseConnection(con);
                Console.Write(string.Format("{0}/{1}", ex.Message, ex.Source));
                DataBaseUtils.PrintMessajeError(this.mensajeExecuteReader.Replace("#replace", " Los Productos"), ex);
                return null;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return dtb;
        }

        public DataTable GetListaGeneralPrecios(EPrecios obj)
        {
            DataTable dtb;
            NpgsqlConnection con = null;

            AccesoBD db = new AccesoBD();
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                dtb = db.EjecutaModelView("almacen.v_listageneralprecios", new object[] { obj.Condicion }, con);
            }
            catch (NpgsqlException ex)
            {
                this.CurrentConection.CloseConnection(con);
                Console.Write(string.Format("{0}/{1}", ex.Message, ex.Source));
                DataBaseUtils.PrintMessajeError(this.mensajeExecuteReader.Replace("#replace", " Los Productos"), ex);
                return null;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return dtb;
        }



        public DataTable GetListadoProducto(ESistema obj)
        {
            DataTable dtb;
            NpgsqlConnection con = null;
            AccesoBD db = new AccesoBD();
            try
            {
                con = this.CurrentConection.GetPostgreSqlConnection();
                dtb = db.EjecutaModelView("almacen.v_listar_productos_general", new object[] { obj.Condicion }, con);
            }
            catch (NpgsqlException ex)
            {
                this.CurrentConection.CloseConnection(con);
                DataBaseUtils.PrintMessajeError(this.mensajeExecuteReader.Replace("#replace", " Los Productos"), ex);
                return null;
            }
            finally
            {
                this.CurrentConection.CloseConnection(con);
            }
            return dtb;
        }

        #region Funciones Publicas
        public EProducto GetProducto(string codigo) {
            EProducto p = null;
            NpgsqlConnection con = CurrentConection.GetPostgreSqlConnection();

            try
            {
                NpgsqlDataReader dr = PostgreSqlHelper.ExecuteReader(CurrentConection, CommandType.Text, "SELECT *  FROM almacen.tb_producto where id_producto ='" + codigo  + "'  ;");
                if (dr.HasRows) {
                    dr.Read();
                    p = new EProducto(dr);
                }
            }
            catch (Exception ex)
            {
                DataBaseUtils.PrintMessajeError("Error: ", ex);
            }
            finally {
                CurrentConection.CloseConnection(con);
            }
            return p;
        }
        #endregion
    }
}